/*
 * @lc app=leetcode.cn id=8 lang=java
 *
 * [8] 字符串转换整数 (atoi)
 */

// @lc code=start
class Solution {
    public int myAtoi(String s) {
        char[] arr = s.toCharArray();
        int n = 0;
        int index = 0;
        int len = arr.length;

        // 1. 去前导空格
        while (index < len && arr[index] == ' ') {
            index++;
        }

        // 全是空格
        if (index == len) {
            return 0;
        }

        int sign = 1;
        char first = arr[index];
        if (first == '+') {
            index++;
        } else if (first == '-') {
            index++;
            sign = -1;
        }

        int res = 0;
        // 如果全部是数字，直接for循环遍历即可。第一个有效的 index 不一定是 0
        while (index < len) {
            if (arr[index] < '0' || arr[index] > '9') {
                break;
            }
            // 当前值，无符号
            int current = arr[index] - '0';
            // 注意，最大最小整数的个位不一样大
            // 越界，返回最大
            // 因为最大最小整数都不是 10 的整数倍，所以最大整数 取 2147483647 的个位，如果当前数字大于 7，则越界
            if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && current > Integer.MAX_VALUE % 10)) {
                return Integer.MAX_VALUE;
            }
            // 越界, 返回最小
            // 与最大整数同理，取 -2147483648 的个位， 如果当前数字大于 8，则越界
            if (res < Integer.MIN_VALUE / 10
                    || (res == Integer.MIN_VALUE / 10 && current > -(Integer.MIN_VALUE % 10))) {
                return Integer.MIN_VALUE;
            }
            // 字符串0的ASCII 码是 30，0 - 9 依次是 30~39, 减 '0' 是为了把字符串转为数字
            // 乘以 10 是为了 10 进制进位
            res = res * 10 + sign * current;
            index++;
        }

        return res;
    }
}
// @lc code=end
